from django.contrib.auth.models import User
from django.db import models

# Create your models here.
from users.models import Address
from utils.modelsMixin import ModelsSetMixin, DateTimeModelsMixin


class Classification(ModelsSetMixin):  # 分类表
    name = models.CharField(max_length=40, verbose_name='分类名')
    parent = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='上级分类')

    class Meta:
        db_table = 'classification'
        verbose_name = '商品分类表'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Commodity(ModelsSetMixin):  # 商品表
    COMMODITY_STATUS = (
        (0, '未上架'),
        (1, '已上架')
    )
    name = models.CharField(max_length=40, verbose_name='商品名')
    caption = models.CharField(max_length=140, verbose_name='副标题')
    brand = models.CharField(max_length=40, verbose_name='品牌', null=True, blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2,
                                verbose_name='价格')  # max_digits 最大位数 decimal_places 小数位
    stock = models.IntegerField(verbose_name='库存')
    pack = models.TextField(verbose_name='包装信息', null=True, blank=True)
    serviceafter_sale = models.TextField(verbose_name='售后服务', null=True, blank=True)
    sales = models.IntegerField(default=0, verbose_name='销量')
    comments = models.IntegerField(default=0, verbose_name='评价数')
    status = models.IntegerField(default=0, verbose_name='状态', choices=COMMODITY_STATUS)
    detail = models.TextField(verbose_name='详情', null=True, blank=True)

    classification1 = models.ForeignKey(Classification, on_delete=models.PROTECT, related_name='classification1')
    classification2 = models.ForeignKey(Classification, on_delete=models.SET_NULL, related_name='classification2',
                                        null=True, blank=True)

    class Meta:
        ordering = ['-sales', '-comments', '-create_time']  # 排序优先级：销量、评论数、创建时间
        db_table = 'commodity'
        verbose_name = '商品'
        verbose_name_plural = verbose_name


class CommodityImg(models.Model):  # 商品图片表
    src = models.TextField(verbose_name='图片地址')
    priority = models.IntegerField(default=0, verbose_name='优先级')
    commodity = models.ForeignKey(Commodity, on_delete=models.CASCADE, verbose_name='关联商品')

    class Meta:
        ordering = ['-priority']
        db_table = 'commodity_img'
        verbose_name = '商品图'
        verbose_name_plural = verbose_name


class ShoppingCart(DateTimeModelsMixin):   # 购物车
    number = models.IntegerField(default=1, verbose_name='数量')

    commodity = models.ForeignKey(Commodity, on_delete=models.CASCADE, verbose_name='商品')
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='用户')

    class Meta:
        ordering = ['-create_time']
        db_table = 'shopping_cart'
        verbose_name = '购物车'
        verbose_name_plural = verbose_name


class Order(DateTimeModelsMixin):  # 一笔订单可以购买多个商品 订单表
    PAY_METHOD = (
        (1, '支付宝'),
        (2, '货到付款')
    )

    STATUS_CHOICES = (
        (1, '待支付'),
        (2, '待发货'),
        (3, '待收货'),
        (4, '待评价'),
        (5, '已完成'),
        (6, '已取消')
    )
    order_id = models.CharField(max_length=64, primary_key=True, verbose_name='订单号')
    total_count = models.IntegerField(default=1, verbose_name='商品数')
    total_amount = models.DecimalField(max_digits=10, decimal_places=2,
                                       verbose_name='商品总金额')
    pay_method = models.IntegerField(verbose_name='支付方式', default=1, choices=PAY_METHOD)
    status = models.IntegerField(verbose_name='订单状态', default=1, choices=STATUS_CHOICES)

    user = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='用户')
    address = models.ForeignKey(Address, on_delete=models.PROTECT, verbose_name='收货地址')

    class Meta:
        ordering = ['-create_time']
        db_table = 'order'
        verbose_name = '订单表'
        verbose_name_plural = verbose_name


class OrderGoods(DateTimeModelsMixin):  # 订单商品表 关联一个订单，每个商品是一条数据
    SCORE_CHOICES = (
        (0, '零星'),
        (1, '一星'),
        (2, '二星'),
        (3, '三星'),
        (4, '四星'),
        (5, '五星')
    )
    number = models.IntegerField(default=1, verbose_name='数量')
    price = models.DecimalField(max_digits=10,decimal_places=2, verbose_name='单价')
    comment = models.TextField(verbose_name='评价',null=True,blank=True)
    score = models.IntegerField(choices=SCORE_CHOICES, null=True, blank=True, verbose_name='评分')
    is_anonymous = models.BooleanField(default=False, verbose_name='匿名评价')

    order = models.ForeignKey(Order, on_delete=models.CASCADE, verbose_name='所属订单')
    commodity = models.ForeignKey(Commodity, on_delete=models.PROTECT, verbose_name='商品')

    class Meta:
        db_table = 'order_goods'
        verbose_name = '订单商品'
        verbose_name_plural = verbose_name
